const { head } = require("request");

// utils/request.js - 微信小程序网络请求工具

// 获取应用实例
let app = null;

// 延迟获取 app 实例，避免初始化时的问题
const getAppInstance = () => {
  if (!app) {
    app = getApp();
  }
  return app;
};

/**
 * 网络请求封装
 * @param {Object} options 请求配置
 * @param {String} options.url 请求地址
 * @param {String} options.method 请求方法 GET/POST/PUT/DELETE
 * @param {Object} options.data 请求数据
 * @param {Object} options.header 请求头
 * @param {Boolean} options.showLoading 是否显示加载动画
 * @param {String} options.loadingText 加载动画文字
 */
function request(options) {
  const app = getAppInstance();
  
  return new Promise((resolve, reject) => {
    const {
      url,
      method = "GET",
      data = {},
      header = {},
      showLoading = false,
      loadingText = "加载中...",
    } = options;

    // 显示加载动画
    if (showLoading) {
      wx.showLoading({
        title: loadingText,
        mask: true,
      });
    }

    const baseUrl = "https://ssat.cromemadnd.cn/api";
    //const baseUrl = "http://localhost:5000";

    // 构建完整的请求URL
    const fullUrl = `${baseUrl}${url}`;
    header["Authorization"] = `Bearer ${wx.getStorageSync("token")}`;

    // 发起网络请求
    wx.request({
      url: fullUrl,
      method: method.toUpperCase(),
      data: data,
      header: {
        "Content-Type": "application/json",
        ...header,
      },
      success: (res) => {
        // 隐藏加载动画
        if (showLoading) {
          wx.hideLoading();
        }

        // 处理响应
        if (Math.floor(res.statusCode / 100) === 2) {
          resolve(res.data);
        } else if (res.statusCode === 401) {
          // token 失效，清除本地存储并跳转到登录页
          wx.removeStorageSync('token');
          wx.showToast({
            title: '登录已过期，请重新登录',
            icon: 'none',
            duration: 2000
          });
          setTimeout(() => {
            wx.reLaunch({ url: '/pages/login/login' });
          }, 2000);
          reject(new Error('登录已过期'));
        } else {
          // 其他错误状态码
          const errorMsg = res.data?.message || '请求失败';
          wx.showToast({
            title: errorMsg,
            icon: 'none',
            duration: 2000
          });
          reject(new Error(errorMsg));
        }
      },
      fail: (err) => {
        // 隐藏加载动画
        if (showLoading) {
          wx.hideLoading();
        }

        // 网络错误处理
        wx.showToast({
          title: '网络连接失败，请检查网络设置',
          icon: 'none',
          duration: 2000
        });
        reject(new Error('网络连接失败'));
      },
    });
  });
}

/**
 * GET请求
 */
function get(url, data = {}, options = {}) {
  return request({
    url,
    method: "GET",
    data,
    ...options,
  });
}

/**
 * POST请求
 */
function post(url, data = {}, options = {}) {
  return request({
    url,
    method: "POST",
    data,
    ...options,
  });
}

/**
 * PUT请求
 */
function put(url, data = {}, options = {}) {
  return request({
    url,
    method: "PUT",
    data,
    ...options,
  });
}

/**
 * DELETE请求
 */
function del(url, data = {}, options = {}) {
  return request({
    url,
    method: "DELETE",
    data,
    ...options,
  });
}

// /**
//  * 文件上传
//  */
// function uploadFile(options) {
//   return new Promise((resolve, reject) => {
//     const {
//       url,
//       filePath,
//       name = 'file',
//       formData = {},
//       showLoading = true,
//       loadingText = '上传中...'
//     } = options

//     if (showLoading) {
//       wx.showLoading({
//         title: loadingText,
//         mask: true
//       })
//     }

//     const fullUrl = url.startsWith('http') ? url : `${app.globalData.baseUrl}${url}`

//     wx.uploadFile({
//       url: fullUrl,
//       filePath: filePath,
//       name: name,
//       formData: formData,
//       success: (res) => {
//         if (showLoading) {
//           wx.hideLoading()
//         }

//         try {
//           const data = JSON.parse(res.data)
//           resolve(data)
//         } catch (e) {
//           resolve(res.data)
//         }
//       },
//       fail: (err) => {
//         if (showLoading) {
//           wx.hideLoading()
//         }
//         reject(new Error('文件上传失败'))
//       }
//     })
//   })
// }

// 导出方法
module.exports = {
  request,
  get,
  post,
  put,
  delete: del,
  //   uploadFile
};
